#情感分析使用分支链
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableBranch,RunnableLambda
from model_utils import getLLM

model = getLLM()

#不同反馈类型的提示模板
#定义根据不同反馈情绪生成的模板：积极，消极，中性和需要升级的反馈

positive_template = ChatPromptTemplate.from_messages(
    [
        ("system","你是一个乐于助人的助手"),
        ("human","为这个正面反馈生成一封感谢信:{feedback}")
    ]
)

negative_template = ChatPromptTemplate.from_messages(
    [
        ("system","你是一个乐于助人的助手"),
        ("human","为这个正面反馈生成一个回复:{feedback}")
    ]
)

neutral_template = ChatPromptTemplate.from_messages(
    [
        ("system","你是一个乐于助人的助手"),
        ("human","为这个中性反馈生成一个获取更多详细信息的请求:{feedback}")
    ]
)

escalate_template = ChatPromptTemplate.from_messages(
    [
        ("system","你是一个有帮助的助手"),
        ("human","生成一条消息以将次反馈升级给人工代理:{feedback}")
    ]
)

#定义反馈分类模板
classification_template = ChatPromptTemplate.from_messages(
    [
        ("system","你是一个有帮助的助手"),
        ("human","将此反馈的情绪分类为积极、消极、中性或升级:{feedback}")
    ]
)

#定义可运行分支处理反馈
branch = RunnableBranch(
    (
        lambda x:"positive" in x,
        positive_template | model | StrOutputParser() #正反馈链
    ),
    (
        lambda x:"negative" in x,
        negative_template | model | StrOutputParser() #负反馈链
    ),
    (
        lambda x:"neutral" in x,
        positive_template | model | StrOutputParser() #正反馈链
    ),
    escalate_template | model | StrOutputParser() #升级反馈链
)

#定义一个RunnableBranch带有条件的用于根据分类结果选择适当的响应生成分支
#创建分类链classifier_template
classifier_template = classification_template | model | StrOutputParser()

#将分类和响应生成组合成一个链
chain = classifier_template | branch

#使用示例评论运行该链
#好评-“该产品非常棒。我真的很喜欢使用它，并且发现它非常有用。"
#差评-“该产品太糟糕了。只用了一次就坏了，质量很差。”
#中评-“该产品还可以。它按预期工作，但没有什么特别之处。"
#默认-"我还不确定该产品。您能告诉我更多关于它的功能和优点的信息吗？”

review = "该产品太糟糕了。只用了一次就坏了，质量很差。"
result = chain.invoke({"feedback": review})

#输出结果：
print(result)